Tumor evolution project

Data used

In this notebook, we are using the tmb_genomic.tsv file generated from the 01-preprocess-data.Rmd script.

Set up

Directories and File Inputs/Outputs

Read in data and process

Error in `select()`:
! Can't subset columns that don't exist.
✖ Column `patient_id` doesn't exist.
Backtrace:
 1. ... %>% ...
 3. dplyr:::select.data.frame(...)

TMB per Patient case

We will explore TMB per Kids_First_Participant_ID over time by creating stacked barplots.

[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/TMB-genomic-total.pdf\

png 
  2 

Attention: Hypermutant TMB defined as ≥10 Mb, and Ultrahypermutant TMB defined as ≥100 mutations/Mb in pediatric brain tumors (https://pubmed.ncbi.nlm.nih.gov/29056344/).

Here, we notice that there are samples with high TMB (hyper-mutant samples). Next, we will exclude these samples (threshold >= 10) from downstream analysis. Attention is needed in cases with high number of mutations in only one timepoint as this will lead to un-matched longitudinal samples. We will also remove those so we always have matched longitudinal samples.

[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/TMB-genomic-no-hypermutants.pdf\

png 
  2 

TMB across timepoints and cancer types per Patient case

We will explore TMB per cancer group over time by creating dumbbell plots. We classified by using cancer types with the highest number of samples (High- and Low-grade gliomas) versus any other cancer groups.

[1] \High-grade glioma\  \Low-grade glioma\   \Other cancer group\
[1] 1
[1] \High-grade glioma\
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/High-grade glioma-TMB-dumbbell.pdf\

[1] 2
[1] \Low-grade glioma\
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Low-grade glioma-TMB-dumbbell.pdf\

[1] 3
[1] \Other cancer group\
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Other cancer group-TMB-dumbbell.pdf\

Total number of mutations across timepoints and cancer types per Patient case

[1] 1
[1] \High-grade glioma\
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/High-grade glioma-Mutations-dumbbell.pdf\

[1] 2
[1] \Low-grade glioma\
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Low-grade glioma-Mutations-dumbbell.pdf\

[1] 3
[1] \Other cancer group\
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Other cancer group-Mutations-dumbbell.pdf\

Let’s see if the issue with missing values per sample int he dumbbell plots is bypassed when using jitter plot.

[1] \High-grade glioma\  \Low-grade glioma\   \Other cancer group\
[1] 1
[1] \High-grade glioma\
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/High-grade glioma-TMB-jitter.pdf\

[1] 2
[1] \Low-grade glioma\
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Low-grade glioma-TMB-jitter.pdf\

[1] 3
[1] \Other cancer group\
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Other cancer group-TMB-jitter.pdf\

It is not… i have tried with side-by-side barplots and it was the same issue. Dumbbell plots might be more informative to show changes across timepoints. We could consider to use them in later analyses.

Total number of mutations across timepoints and biospecimen sample per Patient case

Here, we want to explore the number of mutations per timepoint and biospecimen sample per patient case.

First, let’s try to use facet_wrap function. Again, we are missing values in timepoints.

[1] 1
[1] \High-grade glioma\
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/High-grade glioma-Mutations-barplot.pdf\

[1] 2
[1] \Low-grade glioma\
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Low-grade glioma-Mutations-barplot.pdf\

[1] 3
[1] \Other cancer group\
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Other cancer group-Mutations-barplot.pdf\

But this doesn’t happen when plotting separate barplots per Kids_First_Participant_ID.

 [1] \PT_02J5CWN5\ \PT_0DWRY9ZX\ \PT_1ZAWNGWT\ \PT_2FVTD0WR\ \PT_2MZPGZN1\
 [6] \PT_2YT37G8P\ \PT_37B5JRP1\ \PT_39H4JN6H\ \PT_3GYW6P6P\ \PT_3P3HARZ2\
[11] \PT_3R0P995B\ \PT_3T3VGWC6\ \PT_3VCS1PPF\ \PT_5NS35B66\ \PT_5ZPPR06P\
[16] \PT_62G82T6Q\ \PT_82MX6J77\ \PT_89XRZBSG\ \PT_962TCBVR\ \PT_98QMQZY7\
[21] \PT_99S5BPE3\ \PT_B5DQ8FF0\ \PT_BRVGRXQY\ \PT_BZCJMEX8\ \PT_CWXSP19D\
[26] \PT_CXT81GRM\ \PT_DFQAH7RS\ \PT_DNAJYFZT\ \PT_DVXE38EX\ \PT_FN4GEEFR\
[31] \PT_HE8FBFNA\ \PT_HHG37M6W\ \PT_JNEV57VK\ \PT_JSFBMK5V\ \PT_KMHGNCNR\
[36] \PT_P571HTNK\ \PT_PF04R0BH\ \PT_PR4YBBH3\ \PT_QH9H491G\ \PT_S2SQJVGK\
[41] \PT_T4VN7ZRB\ \PT_TKWTTRQ7\ \PT_TP6GS00H\ \PT_TRZ1N1HQ\ \PT_VTG1S395\
[46] \PT_XA98HG1C\ \PT_XHYBZKCX\ \PT_YK7AD0KK\ \PT_Z4GS3ZQQ\ \PT_ZMKMKCFQ\
[1] 1
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_02J5CWN5-Mutations-barplot.pdf\

[1] 2
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_0DWRY9ZX-Mutations-barplot.pdf\

[1] 3
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_1ZAWNGWT-Mutations-barplot.pdf\

[1] 4
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_2FVTD0WR-Mutations-barplot.pdf\

[1] 5
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_2MZPGZN1-Mutations-barplot.pdf\

[1] 6
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_2YT37G8P-Mutations-barplot.pdf\

[1] 7
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_37B5JRP1-Mutations-barplot.pdf\

[1] 8
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_39H4JN6H-Mutations-barplot.pdf\

[1] 9
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_3GYW6P6P-Mutations-barplot.pdf\

[1] 10
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_3P3HARZ2-Mutations-barplot.pdf\

[1] 11
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_3R0P995B-Mutations-barplot.pdf\

[1] 12
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_3T3VGWC6-Mutations-barplot.pdf\

[1] 13
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_3VCS1PPF-Mutations-barplot.pdf\

[1] 14
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_5NS35B66-Mutations-barplot.pdf\

[1] 15
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_5ZPPR06P-Mutations-barplot.pdf\

[1] 16
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_62G82T6Q-Mutations-barplot.pdf\

[1] 17
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_82MX6J77-Mutations-barplot.pdf\

[1] 18
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_89XRZBSG-Mutations-barplot.pdf\

[1] 19
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_962TCBVR-Mutations-barplot.pdf\

[1] 20
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_98QMQZY7-Mutations-barplot.pdf\

[1] 21
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_99S5BPE3-Mutations-barplot.pdf\

[1] 22
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_B5DQ8FF0-Mutations-barplot.pdf\

[1] 23
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_BRVGRXQY-Mutations-barplot.pdf\

[1] 24
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_BZCJMEX8-Mutations-barplot.pdf\

[1] 25
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_CWXSP19D-Mutations-barplot.pdf\

[1] 26
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_CXT81GRM-Mutations-barplot.pdf\

[1] 27
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_DFQAH7RS-Mutations-barplot.pdf\

[1] 28
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_DNAJYFZT-Mutations-barplot.pdf\

[1] 29
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_DVXE38EX-Mutations-barplot.pdf\

[1] 30
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_FN4GEEFR-Mutations-barplot.pdf\

[1] 31
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_HE8FBFNA-Mutations-barplot.pdf\

[1] 32
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_HHG37M6W-Mutations-barplot.pdf\

[1] 33
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_JNEV57VK-Mutations-barplot.pdf\

[1] 34
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_JSFBMK5V-Mutations-barplot.pdf\

[1] 35
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KMHGNCNR-Mutations-barplot.pdf\

[1] 36
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_P571HTNK-Mutations-barplot.pdf\

[1] 37
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_PF04R0BH-Mutations-barplot.pdf\

[1] 38
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_PR4YBBH3-Mutations-barplot.pdf\

[1] 39
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_QH9H491G-Mutations-barplot.pdf\

[1] 40
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_S2SQJVGK-Mutations-barplot.pdf\

[1] 41
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_T4VN7ZRB-Mutations-barplot.pdf\

[1] 42
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_TKWTTRQ7-Mutations-barplot.pdf\

[1] 43
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_TP6GS00H-Mutations-barplot.pdf\

[1] 44
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_TRZ1N1HQ-Mutations-barplot.pdf\

[1] 45
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_VTG1S395-Mutations-barplot.pdf\

[1] 46
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_XA98HG1C-Mutations-barplot.pdf\

[1] 47
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_XHYBZKCX-Mutations-barplot.pdf\

[1] 48
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_YK7AD0KK-Mutations-barplot.pdf\

[1] 49
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_Z4GS3ZQQ-Mutations-barplot.pdf\

[1] 50
[1] \/home/rstudio/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_ZMKMKCFQ-Mutations-barplot.pdf\

sessionInfo()
R version 4.2.3 (2023-03-15)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 22.04.2 LTS

Matrix products: default
BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3
LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] grid      stats     graphics  grDevices utils     datasets  methods  
[8] base     

other attached packages:
 [1] ggthemes_4.2.4  lubridate_1.9.2 forcats_1.0.0   stringr_1.5.0  
 [5] dplyr_1.1.1     purrr_1.0.1     readr_2.1.4     tidyr_1.3.0    
 [9] tibble_3.2.1    ggplot2_3.4.0   tidyverse_2.0.0

loaded via a namespace (and not attached):
 [1] highr_0.10       bslib_0.4.2      compiler_4.2.3   pillar_1.9.0    
 [5] jquerylib_0.1.4  tools_4.2.3      bit_4.0.5        digest_0.6.31   
 [9] timechange_0.2.0 jsonlite_1.8.4   evaluate_0.20    lifecycle_1.0.3 
[13] gtable_0.3.3     pkgconfig_2.0.3  rlang_1.1.0      cli_3.6.1       
[17] parallel_4.2.3   yaml_2.3.7       xfun_0.38        fastmap_1.1.1   
[21] withr_2.5.0      knitr_1.42       generics_0.1.3   vctrs_0.6.2     
[25] sass_0.4.5       hms_1.1.3        bit64_4.0.5      rprojroot_2.0.3 
[29] tidyselect_1.2.0 glue_1.6.2       R6_2.5.1         fansi_1.0.4     
[33] vroom_1.6.1      rmarkdown_2.21   farver_2.1.1     tzdb_0.3.0      
[37] magrittr_2.0.3   scales_1.2.1     htmltools_0.5.5  colorspace_2.1-0
[41] labeling_0.4.2   utf8_1.2.3       stringi_1.7.12   munsell_0.5.0   
[45] cachem_1.0.7     crayon_1.5.2    
LS0tCnRpdGxlOiAiRXhwbG9yZSBUTUIgYW5kIG51bWJlciBvZiBtdXRhdGlvbnMgYWNyb3NzIG11bHRpcGxlIHRpbWVwb2ludHMgb2YgdGhlIFBCVEEgQ29ob3J0IgphdXRob3I6ICJBbnRvbmlhIENocm9uaSA8Y2hyb25pYUBjaG9wLmVkdT4gZm9yIEQzQiIKZGF0ZTogIjIwMjMiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiBUUlVFCiAgICB0b2NfZmxvYXQ6IFRSVUUKLS0tCgojIyMjIFR1bW9yIGV2b2x1dGlvbiBwcm9qZWN0IAoKIyMjIERhdGEgdXNlZCAKSW4gdGhpcyBub3RlYm9vaywgd2UgYXJlIHVzaW5nIHRoZSBgdG1iX2dlbm9taWMudHN2YCBmaWxlIGdlbmVyYXRlZCBmcm9tIHRoZSBgMDEtcHJlcHJvY2Vzcy1kYXRhLlJtZGAgc2NyaXB0LgoKIyBTZXQgdXAKYGBge3IgbG9hZC1saWJyYXJ5fQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMoewogIGxpYnJhcnkodGlkeXZlcnNlKQp9KQpgYGAKCiMgRGlyZWN0b3JpZXMgYW5kIEZpbGUgSW5wdXRzL091dHB1dHMKYGBge3Igc2V0LWRpci1hbmQtZmlsZS1uYW1lc30KIyBEZXRlY3QgdGhlICIuZ2l0IiBmb2xkZXIuIFRoaXMgd2lsbCBiZSBpbiB0aGUgcHJvamVjdCByb290IGRpcmVjdG9yeS4KIyBVc2UgdGhpcyBhcyB0aGUgcm9vdCBkaXJlY3RvcnkgdG8gZW5zdXJlIHByb3BlciBzb3VyY2luZyBvZiBmdW5jdGlvbnMKIyBubyBtYXR0ZXIgd2hlcmUgdGhpcyBpcyBjYWxsZWQgZnJvbS4Kcm9vdF9kaXIgPC0gcnByb2pyb290OjpmaW5kX3Jvb3QocnByb2pyb290OjpoYXNfZGlyKCIuZ2l0IikpCnNjcmF0Y2hfZGlyIDwtIGZpbGUucGF0aChyb290X2RpciwgInNjcmF0Y2giKQphbmFseXNpc19kaXIgPC0gZmlsZS5wYXRoKHJvb3RfZGlyLCAiYW5hbHlzZXMiLCAidG1iLXZhZi1sb25naXR1ZGluYWwiKSAKaW5wdXRfZGlyIDwtIGZpbGUucGF0aChhbmFseXNpc19kaXIsICJpbnB1dCIpCgojIElucHV0IGZpbGVzCnRtYl9nZW5vbWljX2ZpbGUgPC0gZmlsZS5wYXRoKHNjcmF0Y2hfZGlyLCAidG1iX2dlbm9taWMudHN2IikKcGFsZXR0ZV9maWxlIDwtIGZpbGUucGF0aChyb290X2RpciwgImZpZ3VyZXMiLCAicGFsZXR0ZXMiLCAidHVtb3JfZGVzY3JpcHRvcl9jb2xvcl9wYWxldHRlLnRzdiIpCgojIEZpbGUgcGF0aCB0byBwbG90cyBkaXJlY3RvcnkKcGxvdHNfZGlyIDwtCiAgZmlsZS5wYXRoKGFuYWx5c2lzX2RpciwgInBsb3RzIikKaWYgKCFkaXIuZXhpc3RzKHBsb3RzX2RpcikpIHsKICBkaXIuY3JlYXRlKHBsb3RzX2RpcikKfQoKc291cmNlKHBhc3RlMChhbmFseXNpc19kaXIsICIvdXRpbC9mdW5jdGlvbi1jcmVhdGUtYmFycGxvdC5SIikpCnNvdXJjZShwYXN0ZTAoYW5hbHlzaXNfZGlyLCAiL3V0aWwvZnVuY3Rpb24tY3JlYXRlLWR1bWJiZWxsLXBsb3QuUiIpKQpzb3VyY2UocGFzdGUwKGFuYWx5c2lzX2RpciwgIi91dGlsL2Z1bmN0aW9uLWNyZWF0ZS1qaXR0ZXItcGxvdC5SIikpCnNvdXJjZShwYXN0ZTAocm9vdF9kaXIsICIvZmlndXJlcy9zY3JpcHRzL3RoZW1lLlIiKSkKYGBgCgojIFJlYWQgaW4gZGF0YSBhbmQgcHJvY2VzcwpgYGB7ciByZWFkX2lucHV0X2ZpbGVzfQojIFJlYWQgYW5kIHByb2Nlc3MgdG1iX2dlbm9taWMgZmlsZQpkZl90b3RhbCA8LSByZWFkcjo6cmVhZF90c3YodG1iX2dlbm9taWNfZmlsZSwgZ3Vlc3NfbWF4ID0gMTAwMDAwLCBzaG93X2NvbF90eXBlcyA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCkgJT4lIAogIG11dGF0ZShjZ19kaXN0aW5jdCA9IG5fZGlzdGluY3QoY2FuY2VyX2dyb3VwKSA+IDEpICMgdG8gaWRlbnRpZnkgc2FtcGxlcyB3aXRoIGRpZmZlcmVudCBkaWFnbm9zaXMgYWNyb3NzIHRpbWVwb2ludHMKCiMgQXJlIHRoZXJlIGFueSBzYW1wbGVzIHdpdGggYm90aCBXR1MgYW5kIFdYUz8gCmRmX3RvdGFsICU+JSAKICB1bmlxdWUoKSAlPiUgCiAgYXJyYW5nZShLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lELCBleHBlcmltZW50YWxfc3RyYXRlZ3kpICAlPiUKICBncm91cF9ieShLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lEKSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKGV4cGVyaW1lbnRhbF9zdHJhdGVneV9zdW0gPSBzdHJfYyhleHBlcmltZW50YWxfc3RyYXRlZ3ksIGNvbGxhcHNlID0gIjsiKSkgCgojIFRoZXJlIGFyZSwgc28gbGV0J3MgcmVtb3ZlIHRoZXNlIGZyb20gZG93bnN0cmVhbSBhbmFseXNlcy4KZGYgPC0gZGZfdG90YWwgJT4lIAogIGZpbHRlcighZXhwZXJpbWVudGFsX3N0cmF0ZWd5ID09ICJXWFMiKSAlPiUgCiAgZHBseXI6Om11dGF0ZShwYXRpZW50X2lkID0gcGFzdGUoc2hvcnRfaGlzdG9sb2d5LCBLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lELCBzZXAgPSAiXyIpKSAlPiUgCiAgZGlzdGluY3QoY2FuY2VyX2dyb3VwLCAua2VlcF9hbGwgPSBUUlVFKSAlPiUgCiAgc3VtbWFyaXNlKGNnX3N1bSA9IHN0cl9jKGNhbmNlcl9ncm91cCwgY29sbGFwc2UgPSAiLCIpKSAlPiUgIyB0byBpZGVudGlmeSBjYXNlcyB3aXRoIG11bHRpcGxlIGRpYWdub3NpcwogIGxlZnRfam9pbihkZl90b3RhbCwgYnkgPSBjKCJLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lEIikpICU+JSAKICBzZWxlY3QoS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCwgS2lkc19GaXJzdF9CaW9zcGVjaW1lbl9JRCwgY2dfc3VtLCBjYW5jZXJfZ3JvdXAsIHNob3J0X2hpc3RvbG9neSwgdHVtb3JfZGVzY3JpcHRvciwgZGVzY3JpcHRvcnMsIHR1bW9yX2Rlc2NyaXB0b3Jfc3VtLCB0bWIsIG11dGF0aW9uX2NvdW50KQogIAojIFJlYWQgY29sb3IgcGFsZXR0ZQpwYWxldHRlX2RmIDwtIHJlYWRyOjpyZWFkX3RzdihwYWxldHRlX2ZpbGUsIGd1ZXNzX21heCA9IDEwMDAwMCwgc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkKYGBgCgojIFRNQiBwZXIgUGF0aWVudCBjYXNlCldlIHdpbGwgZXhwbG9yZSBUTUIgcGVyIGBLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lEYCBvdmVyIHRpbWUgYnkgY3JlYXRpbmcgc3RhY2tlZCBiYXJwbG90cy4KCmBgYHtyIGNyZWF0ZS1zdGFja2VkLWJhcnBsb3QsIGZpZy53aWR0aCA9IDE1LCBmaWcuaGVpZ2h0ID0gNiwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9CiMgRGVmaW5lIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uCnlsaW0gPSBtYXgoZGYkdG1iKQoKIyBSZS1vcmRlciBkZgpmIDwtIGMoIlNlY29uZCBNYWxpZ25hbmN5IiwgIlVuYXZhaWxhYmxlIiwgIkRlY2Vhc2VkIiwgIlJlY3VycmVuY2UiLCAiUHJvZ3Jlc3NpdmUiLCAiRGlhZ25vc2lzIikgIyBMZXZlbCBkZiBieSB0aW1lcG9pbnRzCmRmX3Bsb3QgPC0gZGYgJT4lIAogIGRwbHlyOjo6bXV0YXRlKHR1bW9yX2Rlc2NyaXB0b3IgPSBmYWN0b3IodHVtb3JfZGVzY3JpcHRvciksCiAgICAgICAgICAgICAgICAgdHVtb3JfZGVzY3JpcHRvciA9IGZjdF9yZWxldmVsKHR1bW9yX2Rlc2NyaXB0b3IsIGYpKSAKCiMgUnVuIGZ1bmN0aW9uCmZuYW1lIDwtIHBhc3RlMChwbG90c19kaXIsICIvIiwgIlRNQi1nZW5vbWljLXRvdGFsLnBkZiIpCnByaW50KGZuYW1lKQpwIDwtIGNyZWF0ZV9zdGFja2VkX2JhcnBsb3QodG1iX2RmID0gZGZfcGxvdCwgeWxpbSA9IHlsaW0pCnBkZihmaWxlID0gZm5hbWUsIHdpZHRoID0gMTUsIGhlaWdodCA9IDYpCnByaW50KHApCmRldi5vZmYoKQpgYGAKQXR0ZW50aW9uOiBIeXBlcm11dGFudCBUTUIgZGVmaW5lZCBhcyDiiaUxMCBNYiwgYW5kIFVsdHJhaHlwZXJtdXRhbnQgVE1CIGRlZmluZWQgYXMg4omlMTAwIG11dGF0aW9ucy9NYiBpbiBwZWRpYXRyaWMgYnJhaW4gdHVtb3JzIChodHRwczovL3B1Ym1lZC5uY2JpLm5sbS5uaWguZ292LzI5MDU2MzQ0LykuCgpIZXJlLCB3ZSBub3RpY2UgdGhhdCB0aGVyZSBhcmUgc2FtcGxlcyB3aXRoIGhpZ2ggVE1CIChoeXBlci1tdXRhbnQgc2FtcGxlcykuIE5leHQsIHdlIHdpbGwgZXhjbHVkZSB0aGVzZSBzYW1wbGVzICh0aHJlc2hvbGQgPj0gMTApIGZyb20gZG93bnN0cmVhbSBhbmFseXNpcy4gQXR0ZW50aW9uIGlzIG5lZWRlZCBpbiBjYXNlcyB3aXRoIGhpZ2ggbnVtYmVyIG9mIG11dGF0aW9ucyBpbiBvbmx5IG9uZSB0aW1lcG9pbnQgYXMgdGhpcyB3aWxsIGxlYWQgdG8gdW4tbWF0Y2hlZCBsb25naXR1ZGluYWwgc2FtcGxlcy4gV2Ugd2lsbCBhbHNvIHJlbW92ZSB0aG9zZSBzbyB3ZSBhbHdheXMgaGF2ZSBtYXRjaGVkIGxvbmdpdHVkaW5hbCBzYW1wbGVzLgoKYGBge3IgY3JlYXRlLXN0YWNrZWQtYmFycGxvdC1maWx0ZXIsIGZpZy53aWR0aCA9IDE1LCBmaWcuaGVpZ2h0ID0gOCwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9CiMgRmlsdGVyIGRmIGFuZCByZW1vdmUgYW55IHNhbXBsZXMgd2l0aCBzaW5nbGUgdGltZXBvaW50cwpkZl9wbG90X2ZpbHRlciA8LSBkZiAlPiUKICBmaWx0ZXIoIXRtYiA+PSAxMCkgJT4lCiAgdW5pcXVlKCkgJT4lIAogIGFycmFuZ2UoS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCwgdHVtb3JfZGVzY3JpcHRvcikgJT4lCiAgZ3JvdXBfYnkoS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCkgJT4lCiAgZHBseXI6OnN1bW1hcmlzZSh0dW1vcl9kZXNjcmlwdG9yX3N1bSA9IHN0cl9jKHR1bW9yX2Rlc2NyaXB0b3IsIGNvbGxhcHNlID0gIjsiKSkgJT4lIAogIGZpbHRlcighdHVtb3JfZGVzY3JpcHRvcl9zdW0gJWluJSBjKCJEaWFnbm9zaXMiLCAiUHJvZ3Jlc3NpdmUiLCAiUmVjdXJyZW5jZSIsICJTZWNvbmQgTWFsaWduYW5jeSIsICJVbmF2YWlsYWJsZSIsICJEZWNlYXNlZCIsICJQcm9ncmVzc2l2ZTtQcm9ncmVzc2l2ZSIpKSAlPiUgCiAgZHBseXI6OmxlZnRfam9pbihkZiwgYnkgPSBjKCJLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lEIiwgInR1bW9yX2Rlc2NyaXB0b3Jfc3VtIikpICU+JSAKICBtdXRhdGUoY2FuY2VyX2dyb3VwX3N1bSA9IGlmZWxzZShzaG9ydF9oaXN0b2xvZ3kgPT0gIkhHQVQiLCAiSGlnaC1ncmFkZSBnbGlvbWEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzaG9ydF9oaXN0b2xvZ3kgPT0gIkxHQVQiLCAiTG93LWdyYWRlIGdsaW9tYSIsICJPdGhlciBjYW5jZXIgZ3JvdXAiKSksCiAgICAgICAgIGNhbmNlcl9ncm91cF9zdW0gPSByZXBsYWNlX25hKGNhbmNlcl9ncm91cF9zdW0sICJPdGhlciIpLAogICAgICAgICB0dW1vcl9kZXNjcmlwdG9yID0gZmFjdG9yKHR1bW9yX2Rlc2NyaXB0b3IpLAogICAgICAgICB0dW1vcl9kZXNjcmlwdG9yID0gZmN0X3JlbGV2ZWwodHVtb3JfZGVzY3JpcHRvciwgZikpICU+JSAKICBkcm9wX25hKHRtYikgCgojIERlZmluZSBwYXJhbWV0ZXJzIGZvciBmdW5jdGlvbgp5bGltID0gbWF4KGRmX3Bsb3RfZmlsdGVyJHRtYikKZGZfcGxvdF9maWx0ZXIgPC0gZGZfcGxvdF9maWx0ZXIKCiMgUnVuIGZ1bmN0aW9uCmZuYW1lIDwtIHBhc3RlMChwbG90c19kaXIsICIvIiwgIlRNQi1nZW5vbWljLW5vLWh5cGVybXV0YW50cy5wZGYiKQpwcmludChmbmFtZSkKcCA8LSBjcmVhdGVfc3RhY2tlZF9iYXJwbG90KHRtYl9kZiA9IGRmX3Bsb3RfZmlsdGVyLCB5bGltID0geWxpbSkKcGRmKGZpbGUgPSBmbmFtZSwgd2lkdGggPSAyNSwgaGVpZ2h0ID0gOCkKcHJpbnQocCkKZGV2Lm9mZigpCmBgYAoKIyBUTUIgYWNyb3NzIHRpbWVwb2ludHMgYW5kIGNhbmNlciB0eXBlcyBwZXIgUGF0aWVudCBjYXNlCldlIHdpbGwgZXhwbG9yZSBUTUIgcGVyIGNhbmNlciBncm91cCBvdmVyIHRpbWUgYnkgY3JlYXRpbmcgZHVtYmJlbGwgcGxvdHMuIFdlIGNsYXNzaWZpZWQgYnkgdXNpbmcgY2FuY2VyIHR5cGVzIHdpdGggdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIHNhbXBsZXMgKEhpZ2gtIGFuZCBMb3ctZ3JhZGUgZ2xpb21hcykgdmVyc3VzIGFueSBvdGhlciBjYW5jZXIgZ3JvdXBzLgoKYGBge3IgY3JlYXRlLWR1bWJiZWxsLWN0LCBmaWcud2lkdGggPSAxOCwgZmlnLmhlaWdodCA9IDEwLCBmaWcuZnVsbHdpZHRoID0gVFJVRX0KY2FuY2VyX2dyb3VwcyA8LSB1bmlxdWUoYXMuY2hhcmFjdGVyKGRmX3Bsb3RfZmlsdGVyJGNhbmNlcl9ncm91cF9zdW0pKQpjYW5jZXJfZ3JvdXBzIDwtIHNvcnQoY2FuY2VyX2dyb3VwcywgZGVjcmVhc2luZyA9IEZBTFNFKQpwcmludChjYW5jZXJfZ3JvdXBzKQoKZm9yIChpIGluIHNlcV9hbG9uZyhjYW5jZXJfZ3JvdXBzKSkgewogIHByaW50KGkpCiAgZGZfY3Rfc3ViIDwtIGRmX3Bsb3RfZmlsdGVyICU+JSAKICAgIGZpbHRlcihjYW5jZXJfZ3JvdXBfc3VtID09IGNhbmNlcl9ncm91cHMgW2ldKQogIAogIGlmIChpID09IDEpIHsKICAgIHByaW50KGNhbmNlcl9ncm91cHMgW2ldKQogICAgIyBEZWZpbmUgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24KICAgIHlsaW0gPC0gOAogICAgfSBlbHNlIGlmIChpID09IDIpIHsKICAgICAgcHJpbnQoY2FuY2VyX2dyb3VwcyBbaV0pCiAgICAgICMgRGVmaW5lIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uCiAgICAgIHlsaW0gPC0gNAogICAgICB9IGVsc2UgewogICAgICAgIHByaW50KGNhbmNlcl9ncm91cHMgW2ldKQogICAgICAgICMgRGVmaW5lIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uCiAgICAgICAgeWxpbSA8LSA0CiAgICAgIH0KICAgIAogICAgIyBOYW1lIHBsb3RzCiAgICBmbmFtZSA8LSBwYXN0ZTAocGxvdHNfZGlyLCAiLyIsIGNhbmNlcl9ncm91cHNbaV0sICItVE1CLWR1bWJiZWxsIiwgIi5wZGYiKQogICAgcHJpbnQoZm5hbWUpCiAgICAKICAgICMgUnVuIGZ1bmN0aW9uCiAgICBwIDwtIGNyZWF0ZV9kdW1iYmVsbF9jdCh0bWJfZGYgPSBkZl9jdF9zdWIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bGltID0geWxpbSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0X2lkID0gY2FuY2VyX2dyb3Vwc1tpXSkKICAgIHBkZihmaWxlID0gZm5hbWUsIHdpZHRoID0gMTgsIGhlaWdodCA9IDEwKQogICAgcHJpbnQocCkKICAgIGRldi5vZmYoKQp9CmBgYAoKIyBUb3RhbCBudW1iZXIgb2YgbXV0YXRpb25zIGFjcm9zcyB0aW1lcG9pbnRzIGFuZCBjYW5jZXIgdHlwZXMgcGVyIFBhdGllbnQgY2FzZQoKYGBge3IgY3JlYXRlLWR1bWJiZWxsLWN0LW11dCwgZmlnLndpZHRoID0gMTgsIGZpZy5oZWlnaHQgPSAxMCwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9CmZvciAoaSBpbiBzZXFfYWxvbmcoY2FuY2VyX2dyb3VwcykpIHsKICBwcmludChpKQogIGRmX2N0X3N1YiA8LSBkZl9wbG90X2ZpbHRlciAlPiUgCiAgICBmaWx0ZXIoY2FuY2VyX2dyb3VwX3N1bSA9PSBjYW5jZXJfZ3JvdXBzIFtpXSkKICAKICBpZiAoaSA9PSAxKSB7CiAgICBwcmludChjYW5jZXJfZ3JvdXBzIFtpXSkKICAgICMgRGVmaW5lIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uCiAgICB5bGltIDwtIDI2MAogICAgfSBlbHNlIGlmIChpID09IDIpIHsKICAgICAgcHJpbnQoY2FuY2VyX2dyb3VwcyBbaV0pCiAgICAgICMgRGVmaW5lIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uCiAgICAgIHlsaW0gPC0gMTUwCiAgICAgIH0gZWxzZSB7CiAgICAgICAgcHJpbnQoY2FuY2VyX2dyb3VwcyBbaV0pCiAgICAgICAgIyBEZWZpbmUgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24KICAgICAgICB5bGltIDwtIDE1MAogICAgICB9CiAgICAKICAgICMgTmFtZSBwbG90cwogICAgZm5hbWUgPC0gcGFzdGUwKHBsb3RzX2RpciwgIi8iLCBjYW5jZXJfZ3JvdXBzW2ldLCAiLU11dGF0aW9ucy1kdW1iYmVsbCIsICIucGRmIikKICAgIHByaW50KGZuYW1lKQogICAgCiAgICAjIFJ1biBmdW5jdGlvbgogICAgcCA8LSBjcmVhdGVfZHVtYmJlbGxfY3RfbXV0KHRtYl9kZiA9IGRmX2N0X3N1YiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlsaW0gPSB5bGltLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RfaWQgPSBjYW5jZXJfZ3JvdXBzW2ldKQogICAgcGRmKGZpbGUgPSBmbmFtZSwgd2lkdGggPSAxOCwgaGVpZ2h0ID0gMTApCiAgICBwcmludChwKQogICAgZGV2Lm9mZigpCn0KYGBgCgpMZXQncyBzZWUgaWYgdGhlIGlzc3VlIHdpdGggbWlzc2luZyB2YWx1ZXMgcGVyIHNhbXBsZSBpbnQgaGUgZHVtYmJlbGwgcGxvdHMgaXMgYnlwYXNzZWQgd2hlbiB1c2luZyBqaXR0ZXIgcGxvdC4KCgpgYGB7ciBjcmVhdGUtaml0dGVyLWN0LCBmaWcud2lkdGggPSAxOCwgZmlnLmhlaWdodCA9IDEwLCBmaWcuZnVsbHdpZHRoID0gVFJVRX0KY2FuY2VyX2dyb3VwcyA8LSB1bmlxdWUoYXMuY2hhcmFjdGVyKGRmX3Bsb3RfZmlsdGVyJGNhbmNlcl9ncm91cF9zdW0pKQpjYW5jZXJfZ3JvdXBzIDwtIHNvcnQoY2FuY2VyX2dyb3VwcywgZGVjcmVhc2luZyA9IEZBTFNFKQpwcmludChjYW5jZXJfZ3JvdXBzKQoKZm9yIChpIGluIHNlcV9hbG9uZyhjYW5jZXJfZ3JvdXBzKSkgewogIHByaW50KGkpCiAgZGZfY3Rfc3ViIDwtIGRmX3Bsb3RfZmlsdGVyICU+JSAKICAgIGZpbHRlcihjYW5jZXJfZ3JvdXBfc3VtID09IGNhbmNlcl9ncm91cHMgW2ldKQogIAogIGlmIChpID09IDEpIHsKICAgIHByaW50KGNhbmNlcl9ncm91cHMgW2ldKQogICAgIyBEZWZpbmUgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24KICAgIHlsaW0gPC0gOAogICAgfSBlbHNlIGlmIChpID09IDIpIHsKICAgICAgcHJpbnQoY2FuY2VyX2dyb3VwcyBbaV0pCiAgICAgICMgRGVmaW5lIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uCiAgICAgIHlsaW0gPC0gNAogICAgICB9IGVsc2UgewogICAgICAgIHByaW50KGNhbmNlcl9ncm91cHMgW2ldKQogICAgICAgICMgRGVmaW5lIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uCiAgICAgICAgeWxpbSA8LSA0CiAgICAgIH0KICAgIAogICAgIyBOYW1lIHBsb3RzCiAgICBmbmFtZSA8LSBwYXN0ZTAocGxvdHNfZGlyLCAiLyIsIGNhbmNlcl9ncm91cHNbaV0sICItVE1CLWppdHRlciIsICIucGRmIikKICAgIHByaW50KGZuYW1lKQogICAgCiAgICAjIFJ1biBmdW5jdGlvbgogICAgcCA8LSBjcmVhdGVfaml0dGVyX2N0KHRtYl9kZiA9IGRmX2N0X3N1YiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlsaW0gPSB5bGltLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RfaWQgPSBjYW5jZXJfZ3JvdXBzW2ldKQogICAgcGRmKGZpbGUgPSBmbmFtZSwgd2lkdGggPSAxOCwgaGVpZ2h0ID0gMTApCiAgICBwcmludChwKQogICAgZGV2Lm9mZigpCn0KYGBgCgpJdCBpcyBub3QuLi4gaSBoYXZlIHRyaWVkIHdpdGggc2lkZS1ieS1zaWRlIGJhcnBsb3RzIGFuZCBpdCB3YXMgdGhlIHNhbWUgaXNzdWUuCkR1bWJiZWxsIHBsb3RzIG1pZ2h0IGJlIG1vcmUgaW5mb3JtYXRpdmUgdG8gc2hvdyBjaGFuZ2VzIGFjcm9zcyB0aW1lcG9pbnRzLiAKV2UgY291bGQgY29uc2lkZXIgdG8gdXNlIHRoZW0gaW4gbGF0ZXIgYW5hbHlzZXMuCgojIFRvdGFsIG51bWJlciBvZiBtdXRhdGlvbnMgYWNyb3NzIHRpbWVwb2ludHMgYW5kIGJpb3NwZWNpbWVuIHNhbXBsZSBwZXIgUGF0aWVudCBjYXNlCkhlcmUsIHdlIHdhbnQgdG8gZXhwbG9yZSB0aGUgbnVtYmVyIG9mIG11dGF0aW9ucyBwZXIgdGltZXBvaW50IGFuZCBiaW9zcGVjaW1lbiBzYW1wbGUgcGVyIHBhdGllbnQgY2FzZS4KCkZpcnN0LCBsZXQncyB0cnkgdG8gdXNlIGBmYWNldF93cmFwYCBmdW5jdGlvbi4gQWdhaW4sIHdlIGFyZSBtaXNzaW5nIHZhbHVlcyBpbiB0aW1lcG9pbnRzLgoKYGBge3IgY3JlYXRlLWJhcnBsb3Qtc2FtcGxlLXBhbmVsLCBmaWcud2lkdGggPSAyNSwgZmlnLmhlaWdodCA9IDIwLCBmaWcuZnVsbHdpZHRoID0gVFJVRX0KZm9yIChpIGluIHNlcV9hbG9uZyhjYW5jZXJfZ3JvdXBzKSkgewogIHByaW50KGkpCiAgZGZfY3Rfc3ViIDwtIGRmX3Bsb3RfZmlsdGVyICU+JSAKICAgIGZpbHRlcihjYW5jZXJfZ3JvdXBfc3VtID09IGNhbmNlcl9ncm91cHMgW2ldKQogIAogIGlmIChpID09IDEpIHsKICAgIHByaW50KGNhbmNlcl9ncm91cHMgW2ldKQogICAgIyBEZWZpbmUgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24KICAgIHlsaW0gPC0gMjYwCiAgICB9IGVsc2UgaWYgKGkgPT0gMikgewogICAgICBwcmludChjYW5jZXJfZ3JvdXBzIFtpXSkKICAgICAgIyBEZWZpbmUgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24KICAgICAgeWxpbSA8LSAxNTAKICAgICAgfSBlbHNlIHsKICAgICAgICBwcmludChjYW5jZXJfZ3JvdXBzIFtpXSkKICAgICAgICAjIERlZmluZSBwYXJhbWV0ZXJzIGZvciBmdW5jdGlvbgogICAgICAgIHlsaW0gPC0gMTUwCiAgICAgIH0KICAgIAogICAgIyBOYW1lIHBsb3RzCiAgICBmbmFtZSA8LSBwYXN0ZTAocGxvdHNfZGlyLCAiLyIsIGNhbmNlcl9ncm91cHNbaV0sICItTXV0YXRpb25zLWJhcnBsb3QiLCAiLnBkZiIpCiAgICBwcmludChmbmFtZSkKICAgIAogICAgIyBSdW4gZnVuY3Rpb24KICAgIHAgPC0gY3JlYXRlX2JhcnBsb3Rfc2FtcGxlX3BhbmVsKHRtYl9kZiA9IGRmX2N0X3N1YiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlsaW0gPSB5bGltLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RfaWQgPSBjYW5jZXJfZ3JvdXBzW2ldKQogICAgcGRmKGZpbGUgPSBmbmFtZSwgd2lkdGggPSAyNSwgaGVpZ2h0ID0gMjApCiAgICBwcmludChwKQogICAgZGV2Lm9mZigpCn0KYGBgIAoKQnV0IHRoaXMgZG9lc24ndCBoYXBwZW4gd2hlbiBwbG90dGluZyBzZXBhcmF0ZSBiYXJwbG90cyBwZXIgYEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSURgLgoKYGBge3IgY3JlYXRlLWJhcnBsb3Qtc2FtcGxlLCBmaWcud2lkdGggPSA1LCBmaWcuaGVpZ2h0ID0gNCwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9CnNhbXBsZXMgPC0gdW5pcXVlKGFzLmNoYXJhY3RlcihkZl9wbG90X2ZpbHRlciRLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lEKSkKcHJpbnQoc2FtcGxlcykKCmZvciAoaSBpbiBzZXFfYWxvbmcoc2FtcGxlcykpIHsKICBwcmludChpKQogIHRtYl9zdWIgPC0gZGZfcGxvdF9maWx0ZXIgJT4lCiAgICBmaWx0ZXIoS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCA9PSBzYW1wbGVzW2ldKQogIAogICMgRGVmaW5lIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uCiAgeWxpbSA9IG1heChkZl9wbG90X2ZpbHRlciRtdXRhdGlvbl9jb3VudCkKIAogICMgUnVuIGZ1bmN0aW9uCiAgZm5hbWUgPC0gcGFzdGUwKHBsb3RzX2RpciwgIi8iLCBzYW1wbGVzW2ldLCAiLU11dGF0aW9ucy1iYXJwbG90LnBkZiIpCiAgcHJpbnQoZm5hbWUpCiAgcCA8LSBjcmVhdGVfYmFycGxvdF9zYW1wbGUodG1iX2RmID0gdG1iX3N1YiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bGltID0geWxpbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWQgPSBzYW1wbGVzW2ldKQogIHBkZihmaWxlID0gZm5hbWUsIHdpZHRoID0gNSwgaGVpZ2h0ID0gNCkKICBwcmludChwKQogIGRldi5vZmYoKQp9CmBgYAoKYGBge3IgZWNobz1UUlVFfQpzZXNzaW9uSW5mbygpCmBgYAo=